//package com.coldchain.utils;
//
//import java.io.OutputStream;
//import java.lang.reflect.Method;
//import java.math.BigDecimal;
//import java.text.SimpleDateFormat;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.Iterator;
//import java.util.List;
//
//
//import org.apache.poi.hssf.usermodel.HSSFCell;
//import org.apache.poi.hssf.usermodel.HSSFCellStyle;
//import org.apache.poi.hssf.usermodel.HSSFFont;
//import org.apache.poi.hssf.usermodel.HSSFRow;
//import org.apache.poi.hssf.usermodel.HSSFSheet;
//import org.apache.poi.hssf.usermodel.HSSFWorkbook;
//import org.apache.poi.hssf.util.HSSFColor;
//import org.apache.poi.ss.util.Region;
//
///**
// * 下载数据表
// * @author zm
// *
// */
//@SuppressWarnings("deprecation")
//public class OutputFileXSL {
//	private String fileName;
//	
//	public OutputFileXSL(String fileName){
//		this.fileName = fileName;
//	}
//	/**
//	 * <p>此方法进行集合的数据导出在Excel，title格式为 标题:属性名|标题:属性名</p>
//	 * <p>如果属性有按照类型判断则在属性名后面加上内容,  标题:属性名|类型.内容,类型.内容 如: 标题:属性名|1.第一,2.第二</p>
//	 * @param title 操作的字符串
//	 * @param all 集合数据
//	 * @param out 
//	 * @return
//	 * @throws Exception
//	 */
//	public boolean WriteIn(String[] title,List<?> all,OutputStream  out) throws Exception{
//		boolean flag = false;//成功与失败的标记;
//		//1、创建一个workbook对应一个excel文件
//		HSSFWorkbook workbook = new HSSFWorkbook();
//		//2、在workbook中创建一个sheet对应excel中的sheet
//		HSSFSheet sheet = workbook.createSheet(fileName);
//		//3、在sheet表中添加表头第0行，老版本的poi对sheet的行列有限制
//		// Sheet样式    
//		HSSFCellStyle sheetStyle =workbook.createCellStyle();    
//		sheetStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中    
//		sheetStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中    
//		//设置标题头
//		HSSFCellStyle sheetStyle2 =workbook.createCellStyle();  
//		 // 背景色
//		sheetStyle2.setFillBackgroundColor(HSSFColor.GREY_50_PERCENT.index);
//		sheetStyle2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//		
//		sheetStyle2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中    
//		sheetStyle2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中    
//		
//		
//		// 设置列的样式    
//		HSSFFont headfont =workbook.createFont();    
//		headfont.setFontName("宋体");    
//		headfont.setFontHeightInPoints((short) 22);// 字体大小    
//		headfont.setColor(HSSFColor.GREY_50_PERCENT.index);//HSSFColor.VIOLET.index //字体颜色
//		//headfont.setColor(HSSFColor.ORANGE.index);//HSSFColor.VIOLET.index //字体颜色
//		headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗   
//		sheetStyle2.setFont(headfont);
//		HSSFRow row = sheet.createRow(1);
//		HSSFRow headrow = sheet.createRow(0);
//		int cellIndex = 0;
//		//5、创建单元格，设置表头
//		HSSFCell cell = row.createCell(2);
//		HSSFCell head = row.createCell(1);
//		for(int x = 0; x < title.length;x++){
//			if(title[x].startsWith("*")){
//				int toindex = this.getHead(title, x, "*")-this.getHeadCount(title,"*");
//				//设置表头数据
//				head = headrow.createCell((x-cellIndex));
//				head.setCellValue(title[x].substring(1, title[x].length()));
//				sheet.setColumnWidth(x,4500);    
//				head.setCellStyle(sheetStyle2);
//				int start = x!=0?x-1:x;
//				int end = x==0?toindex+x:toindex+x-this.getHeadCount(title,"*");
//				sheet.addMergedRegion(new Region(0,(short)start,0,(short)end));
//				cellIndex++;
//			}else{
//				//设置表头数据
//				String resutl[] = title[x].split(":");
//				cell = row.createCell((x-cellIndex));
//				cell.setCellValue(resutl[0]);
//				sheet.setColumnWidth(x,4500);    
//				cell.setCellStyle(sheetStyle);
//			}
//		}
//		title = this.getNewtitle(title,(title.length-cellIndex));
//		Iterator<?> itertor =  all.iterator();
//		int count =1;//计算行数
//		//****************里面有点复杂
//		//循环最外层的list
//		while(itertor.hasNext()){
//			//创建一行
//			HSSFRow row1 = sheet.createRow((count+1));
//			//row2是用来输出当前对象里面的list输出的，当前对象没有list要输出的可以无视
//			HSSFRow row2 =null;
//			//用来保留当前对象里面的list里面的行，如果不保留二次进去用重复创建行，导致格式不对
//			List<HSSFRow> listrow = new ArrayList<HSSFRow>();
//			int maxlist = 0;//保存list个，保留二次需要创建的行数
//			count++;//表示当前行数
//			Object obj = itertor.next();
//			//	Field[] fields = obj.getClass().getDeclaredFields();// 取得全部的成员
//			//第五步，写入实体数据，实际应用中这些数据从数据库得到,对象封装数据，集合包对象。对象的属性值对应表的每行的值
//			//拆分数据，按‘|’拆,数组的第二个属性名字然后前面加上get用反射取得内容
//			for(int x = 0; x < title.length;x++){
//				String resutl2[] = title[x].split("\\|");
//				String resutl[] = null;
//				//如果大于1说明字符串后面‘|’有要判断的数据数据要按resutl2拆分
//				if(resutl2.length>1){
//					resutl = resutl2[0].split(":");
//				}else{//没判断数据根据title[x]拆分
//					resutl = title[x].split(":");
//				}
//				//保存方法名称get加入属性名字
//				String methodName;
//				if(resutl.length>1){
//					methodName = "get" + initcap(resutl[1]);
//				}else{
//					continue;//表示字符串格式不对，防止报异常终止跳出本次循环
//				}
//				//得到Method的方法
//				Method met = obj.getClass().getMethod(methodName);
//				//如果等于null直接输出 “”
//				if(met.invoke(obj)!=null){//不等于null
//					//如果是list则要进行二次循环
//					if ("ArrayList".equalsIgnoreCase(met.invoke(obj).getClass().getSimpleName())){
//						List<?> list = (List<?>) met.invoke(obj);
//						maxlist = list.size();
//						//resutl的第三是list后面取的值对象名字
//						if(resutl.length==3){
//							for(int i =0; i < list.size();i++){
//								//判断是否是第一次进来
//								if(maxlist!=listrow.size()){//等于就是第二列输出就不用再创建行了，行对象保存在listrow对象里面
//									if(listrow.isEmpty()){
//										listrow.add(row1);//保存对象
//										//合并单元格
//										//如果大于1需要合并单元格
//										if(list.size()>1){
//											for(int y = 0; y < x;y++){
//												sheet.addMergedRegion(new Region(count,(short)y,count+list.size()-1,(short)y));
//											}
//										}
//									}else{
//										row2 = sheet.createRow((count+1));
//										listrow.add(row2);//保存对象
//										count++;//把添加了多少行加上
//									}
//								}	
//								HSSFCell cell2 = listrow.get(i).createCell(x);
//								cell2.setCellStyle(sheetStyle);
//								String methodNameTo;//保存方法名字
//								methodNameTo = "get"+initcap(resutl[2]);
//								Object objTo = list.get(i);
//								Method metto = objTo.getClass().getMethod(methodNameTo);//得到Method对象
//								
//								//如果等于null直接输出 “”
//								if(metto.invoke(objTo)!=null){
//									//设置单元格值
//									this.setsetCellVaule(cell2, resutl2, metto, objTo);
//								}else{
//									cell2.setCellValue("");
//								}
//							}
//						}
//					}else{
//						HSSFCell cell1 = row1.createCell(x);
//						cell1.setCellStyle(sheetStyle);
//						//设置单元格值
//						this.setsetCellVaule(cell1,resutl2,met,obj);
//					}
//				}else{
//					HSSFCell cell1 = row1.createCell(x);
//					cell1.setCellStyle(sheetStyle);
//					cell1.setCellValue("");
//				}
//			}
//		}
//		//将文件保存到指定的位置
//		workbook.write(out);
//		flag = true;
//		return flag;
//	}
//	/**
//	 * <p>时间转换格式</p>
//	 * @param date
//	 * @return
//	 */
//	private String dateFormat(Date date){
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//		if(date==null){
//			return "";
//		}else{
//			return sdf.format(date);
//		}
//	}
//	/**
//	 * <p>将字符串首字母变成大写，如果是大写则变成小写</p>
//	 * @param str
//	 * @return
//	 */
//	private String initcap(String str){
//		String str2 = str;
//		char c = str.substring(0,1).charAt(0);
//		if (!Character.isLowerCase(c)){
//			return str2.substring(0,1).toLowerCase()+str2.substring(1);
//		}else{
//			return str2.substring(0,1).toUpperCase()+str2.substring(1);
//		}
//	}
//	/**
//	 * 
//	 * <p>此方法判断str里面的数据按照','拆分后按照'.'拆分 例如1.一,2.二要判断stauts=1或2返回相应的.后面的值</p>
//	 * @param str value1
//	 * @param stauts value2
//	 * @return
//	 */
//	private String replacement(String str,String stauts){
//		String[] result = str.split(",");
//		for(int x = 0; x < result.length;x++){
//			String[] text = result[x].split("\\.");
//			for(int i = 0; i < text.length;i++){
//				if(text[0].equals(stauts)){
//					return text[1];
//				}
//			}
//		}
//		return "";
//	}
//	/**
//	 * <p>设置单元格值</p>
//	 * @param cell1 单元格对象
//	 * @param resutl2 判断数据
//	 * @param met 方法对象
//	 * @param obj Object对象
//	 * @throws Exception 操作Method时抛出的异常
//	 */
//	private void setsetCellVaule(HSSFCell cell1,String[] resutl2,Method met,Object obj) throws Exception{
//		//如果是特殊对象如时间，需要转格式输出
//		if(resutl2.length>1){//大于1说明后面有判断数据掉用判断方法
//			cell1.setCellValue(this.replacement(resutl2[1],met.invoke(obj).toString()));
//		}else{
//			if ("Date".equalsIgnoreCase(met.invoke(obj).getClass().getSimpleName())){//如果是时间对象需要转换格式调用时间转换格式
//				Date date = (Date) met.invoke(obj);
//				cell1.setCellValue(this.dateFormat(date));
//			}else if("BigDecimal".equalsIgnoreCase(met.invoke(obj).getClass().getSimpleName())){//如果是BigDecimal转换为double类型
//				BigDecimal bigDecimal = (java.math.BigDecimal) met.invoke(obj);
//				cell1.setCellValue(bigDecimal.doubleValue());
//			}else{
//				cell1.setCellValue(met.invoke(obj).toString());//直接输出字符串
//			}
//		}
//	}
//	/**
//	 * <p>flag开始查找到下一个flag结束</p>
//	 * @param title	查找的内容
//	 * @param index	开始查找地方
//	 * @param flag	标记
//	 * @return	如果找到title返回索引没有找到返回null
//	 */
//	private int getHead(String[] title,Integer index,String flag){
//		int toindex = 0;
//		for(int x =index; x<title.length-index;x++){
//			if(title[x].startsWith("*")){
//				toindex = x-index;
//			}
//		}
//		if(toindex==0){
//			return title.length-index;
//		}
//		return toindex;
//	}
//	/**
//	 * <p>去除head得到一个新的titles</p>
//	 * @param titles
//	 * @param length
//	 * @return
//	 */
//	private String[] getNewtitle(String[] titles,int length){
//		String netitles[] = new String[length];
//		int count=0 ;
//		for(int x=0; x<titles.length;x++){
//			if(!titles[x].startsWith("*")){
//				netitles[count] = titles[x];
//				count++;
//			}
//		}
//		return netitles;
//	}
//	/**
//	 * <p>计算有几个head</p>
//	 * @param titles
//	 * @param length
//	 * @return
//	 */
//	private int getHeadCount(String[] titles,String falg){
//		int count=0 ;
//		for(int x=0; x<titles.length;x++){
//			if(titles[x].startsWith(falg)){
//				count++;
//			}
//		}
//		return count;
//	}
//}
